package com.psdi.controller;

import com.psdi.Main;
import com.psdi.element.*;
import com.psdi.manager.ElementManager;
import com.psdi.manager.EnemySystem;
import com.psdi.manager.GameLoader;
import com.psdi.manager.GameManager;
import com.psdi.physics.CollisionSystem;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 游戏主线程类
 * 控制游戏的主循环和逻辑处理
 */
public class GameThread extends Thread {
    private final ElementManager elementManager;
    public GameThread(){
        elementManager= ElementManager.getINSTANCE();
    }
    @Override
    public void run() {
        // 游戏开始前
        ImgLoad();
        while(Main.READY){
            if(Input.getMouseButton(MouseButton.LEFT))
            {
                Main.Start = true;
                break;
            }
            try {
                Thread.sleep(50); // 降低 CPU 占用，确保捕获输入
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return;
            }
        }
        gameLoad();
        ElementManager.getINSTANCE().getGameElements().get(Tag.END).remove(0);
        while (Main.Start) {
            // 游戏进行时
            gameRunning();
            // 游戏场景结束 场景资源回收
            gameEnd();
            try {
                //noinspection BusyWait
                sleep(Main.MILLI_DELTA_TIME);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }

    /**
     * 游戏加载方法
     * 在游戏开始前加载必要的资源和设置
     * 例如：地图、玩家、敌人等元素的初始化
     */
    private void ImgLoad() {

        GameLoader.LoadImg();
        GameLoader.LoadEnd(true);
    }
    private void gameLoad() {
        GameLoader.mapLoad("MAP1");
//        load();
        GameLoader.LoadPlay();
        GameLoader.LoadLevel();//一定要位于player后面
    }

    /**
     * 游戏运行方法
     * 在游戏进行时处理游戏逻辑
     * 例如：玩家输入、敌人行为、碰撞检测等
     */
    private void gameRunning() {
        while (!GameManager.Gamefinish) {
            // 处理游戏逻辑
            Map<Tag, List<ElementObject>> gameElements = elementManager.getGameElements();
            for (Tag tag : Tag.values()) {
                // 获取所有元素并更新
                List<ElementObject> elementObjects = gameElements.get(tag);
                if (elementObjects == null) continue;
                for (int i = elementObjects.size() - 1; i >= 0; i--) {
                    ElementObject elementObject = elementObjects.get(i);
                    if (!elementObject.isAlive()){
                        elementObject.onDestroy(); // 如果元素不存活，调用销毁方法
                        elementObjects.remove(i); // 如果元素不存活，则从列表中移除
                        continue; // 跳过当前循环，继续处理下一个元素
                    }
                    elementObject.update(); // 更新元素状态
                }
            }
            GameManager.gameManager.Detectlevel();
            GameManager.gameManager.checkGameconditon();
            // 其他游戏逻辑处理...
            try {
                //noinspection BusyWait
                sleep(Main.MILLI_DELTA_TIME);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    /**
     * 游戏结束方法
     * 在游戏结束时处理资源回收和清理工作
     * 例如：释放内存、保存游戏状态等
     */
    private void gameEnd() {
        GameManager.gameManager.clearallelements();
//        Main.READY = false;
    }
}
